#include<stdio.h>
#include<assert.h>

/*memcpy和memmove的区别（memcpy会进行覆盖copy，memmove不会进行覆盖）*/
/*当src (arr+1)指向的元素在dest(arr+2)的左边时，
如果进行copy，那就是将第二个元素赋值给了第三个元素，第三个元素也就变成了2，
等dest和src指针 ++以后，第三个原始为第四也元素赋值，第四个元素也成了2,
以此类推，直至copy完四个元素。
也就是说：当dest小于src时，我们要从左边赋值，
但是当dest大于src时，我们则不能在从左到右的copy了，而必须从右到左的copy*/

//此时为字符数组
// char* my_memmove(char* desc,const char* scr,int num)
// {
//     assert(desc && scr);
//     char* ret=desc;
//     //当desc<scr是，我们要从左开始copy
//     if(desc<scr)
//     {
//         while(num--)
//         {
//             desc=scr;
//             desc=desc+1;
//             scr=scr+1;
//         }
//     }
//     //当desc>scr时，要从右边开始copy
//     else
//     {
//         while(num--)
//         {
//             *(desc+num)=*(scr+num);
//         }
//     }
//     return ret;
// }

//当函数在主函数下面时，要先进行声明，否则cpu无法从下往上查找
// void* my_memmove(char* desc,const char* scr,int num);

// int main()
// {
//     char scr[]="zxcasd";
//     char desc[]="xxxxxxxx";
//     int num=5;
//     my_memmove(desc,scr,num);
//     printf("%s",desc);
//     return 0;
// }
//当返回值为void时
//要进行强转
void* my_memmove(char* desc,const char* scr,int num)
{
    assert(desc && scr);
    char* ret=(char*)desc;
    //当desc<scr是，我们要从左开始copy
    if(desc<scr)
    {
        while(num--)
        {
            desc=(char*)scr;
            desc=(char*)desc+1;
            scr=(char*)scr+1;
        }
    }
    //当desc>scr时，要从右边开始copy
    else
    {
        while(num--)
        {
            *((char*)desc+num)=*((char*)scr+num);
        }
    }
    return ret;
}

// int* my_memmove(int* desc,const int* scr,int num)
// {
//     assert(desc && scr);
//     int* ret=(char*)desc;
//     //当desc<scr是，我们要从左开始copy
//     if(desc<scr)
//     {
//         while(num--)
//         {
//             desc=(int*)scr;
//             desc=(int*)desc+1;
//             scr=(int*)scr+1;
//         }
//     }
//     //当desc>scr时，要从右边开始copy
//     else
//     {
//         while(num--)
//         {
//             *((int*)desc+num)=*((int*)scr+num);
//         }
//     }
//     return ret;
// }

// int main()
// {
//     int scr[]={1,2,3,4,5,6,7,8,9};
    
//     int num=5;
//     //目标函数大于原函数
//     my_memmove(scr+2,scr+1,num);
//     for(int i=0;i<9;i++)
//     {
//        printf("%d",scr[i]); 
//     }
    
//     return 0;
// }

//结果：122345689
#include<string.h>
int main()
{
    int scr[]={1,2,3,4,5,6,7,8,9};
    
    int num=5;
    //目标函数大于原函数
    memmove(scr+2,scr+1,num);
    for(int i=0;i<9;i++)
    {
       printf("%d",scr[i]); 
    }
    
    return 0;
}